#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import json
import os

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False

print("开始创建可视化图表...")

# 加载数据
df = pd.read_csv('学生社交媒体与人际关系数据集/学生社交媒体与人际关系数据集.csv')

# 创建输出目录
if not os.path.exists('static'):
    os.makedirs('static')
if not os.path.exists('static/charts'):
    os.makedirs('static/charts')

plt.style.use('default')
sns.set_style("whitegrid")

# 1. 使用时间分布图
plt.figure(figsize=(10, 6))
plt.hist(df['Avg_Daily_Usage_Hours'], bins=30, alpha=0.7, color='skyblue', edgecolor='black')
plt.title('学生社交媒体每日使用时间分布', fontsize=16, fontweight='bold')
plt.xlabel('每日使用时间 (小时)', fontsize=12)
plt.ylabel('学生人数', fontsize=12)
plt.axvline(df['Avg_Daily_Usage_Hours'].mean(), color='red', linestyle='--', 
           label=f'平均值: {df["Avg_Daily_Usage_Hours"].mean():.1f}小时')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('static/charts/usage_distribution.png', dpi=300, bbox_inches='tight')
plt.close()

# 2. 平台使用分布饼图
plt.figure(figsize=(12, 8))
platform_counts = df['Most_Used_Platform'].value_counts()
colors = plt.cm.Set3(range(len(platform_counts)))
plt.pie(platform_counts.values, labels=platform_counts.index, autopct='%1.1f%%', 
        colors=colors, startangle=90)
plt.title('社交媒体平台使用分布', fontsize=16, fontweight='bold')
plt.axis('equal')
plt.tight_layout()
plt.savefig('static/charts/platform_distribution.png', dpi=300, bbox_inches='tight')
plt.close()

# 3. 相关性热力图
plt.figure(figsize=(10, 8))
numeric_cols = ['Age', 'Avg_Daily_Usage_Hours', 'Sleep_Hours_Per_Night', 
               'Mental_Health_Score', 'Conflicts_Over_Social_Media', 'Addicted_Score']
correlation_matrix = df[numeric_cols].corr()
mask = correlation_matrix.isnull()
sns.heatmap(correlation_matrix, annot=True, cmap='RdBu_r', center=0, 
           square=True, fmt='.3f', cbar_kws={"shrink": .8}, mask=mask)
plt.title('变量相关性热力图', fontsize=16, fontweight='bold')
plt.tight_layout()
plt.savefig('static/charts/correlation_heatmap.png', dpi=300, bbox_inches='tight')
plt.close()

# 4. 学术表现影响分析
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))

# 学术表现影响分布
academic_impact = df['Affects_Academic_Performance'].value_counts()
colors = ['lightcoral', 'lightgreen']
ax1.bar(academic_impact.index, academic_impact.values, color=colors)
ax1.set_title('社交媒体对学术表现的影响', fontsize=14, fontweight='bold')
ax1.set_ylabel('学生人数')
for i, v in enumerate(academic_impact.values):
    ax1.text(i, v + 100, str(v), ha='center', va='bottom', fontweight='bold')

# 使用时间与学术表现的关系
affected_usage = df[df['Affects_Academic_Performance'] == 'Yes']['Avg_Daily_Usage_Hours']
not_affected_usage = df[df['Affects_Academic_Performance'] == 'No']['Avg_Daily_Usage_Hours']

ax2.boxplot([affected_usage, not_affected_usage], labels=['影响', '不影响'])
ax2.set_title('使用时间与学术表现影响关系', fontsize=14, fontweight='bold')
ax2.set_ylabel('每日使用时间 (小时)')
ax2.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('static/charts/academic_impact.png', dpi=300, bbox_inches='tight')
plt.close()

# 5. 心理健康分析
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))

# 心理健康评分分布
ax1.hist(df['Mental_Health_Score'], bins=10, alpha=0.7, color='lightblue', edgecolor='black')
ax1.set_title('心理健康评分分布', fontsize=14, fontweight='bold')
ax1.set_xlabel('心理健康评分')
ax1.set_ylabel('学生人数')
ax1.axvline(df['Mental_Health_Score'].mean(), color='red', linestyle='--', 
           label=f'平均值: {df["Mental_Health_Score"].mean():.1f}')
ax1.legend()
ax1.grid(True, alpha=0.3)

# 使用时间与心理健康的散点图
ax2.scatter(df['Avg_Daily_Usage_Hours'], df['Mental_Health_Score'], alpha=0.5)
ax2.set_title('使用时间与心理健康关系', fontsize=14, fontweight='bold')
ax2.set_xlabel('每日使用时间 (小时)')
ax2.set_ylabel('心理健康评分')
ax2.grid(True, alpha=0.3)

# 添加趋势线
z = np.polyfit(df['Avg_Daily_Usage_Hours'], df['Mental_Health_Score'], 1)
p = np.poly1d(z)
ax2.plot(df['Avg_Daily_Usage_Hours'], p(df['Avg_Daily_Usage_Hours']), "r--", alpha=0.8)

plt.tight_layout()
plt.savefig('static/charts/mental_health_analysis.png', dpi=300, bbox_inches='tight')
plt.close()

# 6. 平台成瘾评分对比
plt.figure(figsize=(12, 8))
platform_addiction = df.groupby('Most_Used_Platform')['Addicted_Score'].mean().sort_values(ascending=True)
plt.barh(range(len(platform_addiction)), platform_addiction.values, color='orange', alpha=0.7)
plt.yticks(range(len(platform_addiction)), platform_addiction.index)
plt.title('各社交媒体平台平均成瘾评分', fontsize=16, fontweight='bold')
plt.xlabel('平均成瘾评分')
plt.grid(True, alpha=0.3, axis='x')

# 添加数值标签
for i, v in enumerate(platform_addiction.values):
    plt.text(v + 0.05, i, f'{v:.2f}', va='center', fontweight='bold')

plt.tight_layout()
plt.savefig('static/charts/platform_addiction.png', dpi=300, bbox_inches='tight')
plt.close()

# 7. 人口统计分析
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(15, 12))

# 性别分布
gender_counts = df['Gender'].value_counts()
ax1.pie(gender_counts.values, labels=gender_counts.index, autopct='%1.1f%%', 
        colors=['lightblue', 'pink'])
ax1.set_title('性别分布', fontsize=14, fontweight='bold')

# 学历分布
academic_counts = df['Academic_Level'].value_counts()
ax2.pie(academic_counts.values, labels=academic_counts.index, autopct='%1.1f%%',
        colors=['lightgreen', 'lightyellow', 'lightcoral'])
ax2.set_title('学历分布', fontsize=14, fontweight='bold')

# 性别与使用时间关系
gender_usage = df.groupby('Gender')['Avg_Daily_Usage_Hours'].mean()
ax3.bar(gender_usage.index, gender_usage.values, color=['lightblue', 'pink'])
ax3.set_title('性别与平均使用时间关系', fontsize=14, fontweight='bold')
ax3.set_ylabel('平均使用时间 (小时)')
for i, v in enumerate(gender_usage.values):
    ax3.text(i, v + 0.05, f'{v:.2f}', ha='center', va='bottom', fontweight='bold')

# 学历与成瘾评分关系
academic_addiction = df.groupby('Academic_Level')['Addicted_Score'].mean()
ax4.bar(range(len(academic_addiction)), academic_addiction.values, 
        color=['lightgreen', 'lightyellow', 'lightcoral'])
ax4.set_xticks(range(len(academic_addiction)))
ax4.set_xticklabels(academic_addiction.index, rotation=45)
ax4.set_title('学历与平均成瘾评分关系', fontsize=14, fontweight='bold')
ax4.set_ylabel('平均成瘾评分')
for i, v in enumerate(academic_addiction.values):
    ax4.text(i, v + 0.05, f'{v:.2f}', ha='center', va='bottom', fontweight='bold')

plt.tight_layout()
plt.savefig('static/charts/demographics.png', dpi=300, bbox_inches='tight')
plt.close()

# 8. 恋爱关系状态分析
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))

# 恋爱状态分布
relationship_counts = df['Relationship_Status'].value_counts()
colors = ['lightgreen', 'lightcoral', 'gold']
ax1.pie(relationship_counts.values, labels=relationship_counts.index, autopct='%1.1f%%',
        colors=colors)
ax1.set_title('恋爱关系状态分布', fontsize=14, fontweight='bold')

# 恋爱状态与冲突次数关系
relationship_conflicts = df.groupby('Relationship_Status')['Conflicts_Over_Social_Media'].mean()
ax2.bar(relationship_conflicts.index, relationship_conflicts.values, color=colors)
ax2.set_title('恋爱状态与社交媒体冲突次数关系', fontsize=14, fontweight='bold')
ax2.set_ylabel('平均冲突次数')
ax2.tick_params(axis='x', rotation=45)
for i, v in enumerate(relationship_conflicts.values):
    ax2.text(i, v + 0.05, f'{v:.2f}', ha='center', va='bottom', fontweight='bold')

plt.tight_layout()
plt.savefig('static/charts/relationship_analysis.png', dpi=300, bbox_inches='tight')
plt.close()

print("可视化图表创建完成！")
print("已创建以下图表:")
print("1. 使用时间分布图 - usage_distribution.png")
print("2. 平台分布图 - platform_distribution.png") 
print("3. 相关性热力图 - correlation_heatmap.png")
print("4. 学术影响分析 - academic_impact.png")
print("5. 心理健康分析 - mental_health_analysis.png")
print("6. 平台成瘾评分 - platform_addiction.png")
print("7. 人口统计分析 - demographics.png")
print("8. 恋爱关系分析 - relationship_analysis.png")
